<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: Ruby 接口</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/if_ruby.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>if_ruby</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="if_ruby.txt">if_ruby.txt</a> </b>   适用于 Vim 9.0 版本。   最近更新: 2020年4月


                  <code class="vim">VIM 参考手册    by Shugo Maeda</code>
                                <code class="vim">译者</code>: Willis、tocer

Vim 的 Ruby 接口                                        <b class="vimtag"> <a name="ruby">ruby</a> </b> <b class="vimtag"> <a name="Ruby">Ruby</a> </b>


1. 命令                          <a href="if_ruby.html#ruby-commands">ruby-commands</a> 
2. Vim 模块                      <a href="if_ruby.html#ruby-vim">ruby-vim</a> 
3. Vim::Buffer 对象              <a href="if_ruby.html#ruby-buffer">ruby-buffer</a> 
4. Vim::Window 对象              <a href="if_ruby.html#ruby-window">ruby-window</a> 
5. 全局变量                      <a href="if_ruby.html#ruby-globals">ruby-globals</a> 
6. rubyeval() Vim 函数           <a href="if_ruby.html#ruby-rubyeval">ruby-rubyeval</a> 
7. 动态调入                      <a href="if_ruby.html#ruby-dynamic">ruby-dynamic</a> 

                        <b class="vimtag"> <a name="E266">E266</a> </b> <b class="vimtag"> <a name="E267">E267</a> </b> <b class="vimtag"> <a name="E268">E268</a> </b> <b class="vimtag"> <a name="E269">E269</a> </b> <b class="vimtag"> <a name="E270">E270</a> </b> <b class="vimtag"> <a name="E271">E271</a> </b> <b class="vimtag"> <a name="E272">E272</a> </b> <b class="vimtag"> <a name="E273">E273</a> </b>

<code class="notvi">{仅当编译 Vim 时加入  <a href="various.html#+ruby">+ruby</a>  特性才有效}</code>

ruby 的主页是 <a href="http://www.ruby-lang.org/">http://www.ruby-lang.org/</a>。你可以在那里找到 Ruby 下载的链接。

</section><hr class="doubleline" /><section class=inner>
<h4>1. 命令                                                 <b class="vimtag"> <a name="ruby-commands">ruby-commands</a> </b></h4>
                                                        <b class="vimtag"> <a name=":ruby">:ruby</a> </b> <b class="vimtag"> <a name=":rub">:rub</a> </b>
:rub[y] <code class="special">{cmd}</code>           执行 Ruby 命令 <code class="special">{cmd}</code>。要试一试: 
<code class="example">                                :ruby print "Hello"</code>
<code class="example"></code>
:rub[y] &lt;&lt; <code class="special">[trim]</code> [<code class="special">{endmarker}</code>]
<code class="special">{script}</code>
<code class="special">{endmarker}</code>
                        执行 Ruby 脚本 <code class="special">{script}</code>。

                        如果省略 <code class="special">[endmarker]</code>，缺省为单个句号 '.'，类似于
                         <a href="insert.html#:append">:append</a>  和  <a href="insert.html#:insert">:insert</a>  命令。更多详情可见
                         <a href="eval.html#:let-heredoc">:let-heredoc</a> 。

                        这种形式的  <a href="if_ruby.html#:ruby">:ruby</a>  命令主要用于在 vim 脚本里包含 ruby
                        代码。

                        <code class="note">注意</code>: 如果编译时没有加入 Ruby 特性，这个命令不会工作。
                        为了避免错误，参看  <a href="if_perl.html#script-here">script-here</a> 。

示例 Vim 脚本: 
<code class="example"></code>
<code class="example">        function! RedGem()</code>
<code class="example">        ruby &lt;&lt; EOF</code>
<code class="example">        class Garnet</code>
<code class="example">                def initialize(s)</code>
<code class="example">                        @buffer = Vim::Buffer.current</code>
<code class="example">                        vimputs(s)</code>
<code class="example">                end</code>
<code class="example">                def vimputs(s)</code>
<code class="example">                        @buffer.append(@buffer.count,s)</code>
<code class="example">                end</code>
<code class="example">        end</code>
<code class="example">        gem = Garnet.new("pretty")</code>
<code class="example">        EOF</code>
<code class="example">        endfunction</code>

要看运行的 Ruby 版本: 
<code class="example">        :ruby print RUBY_VERSION</code>


                                                <b class="vimtag"> <a name=":rubydo">:rubydo</a> </b> <b class="vimtag"> <a name=":rubyd">:rubyd</a> </b> <b class="vimtag"> <a name="E265">E265</a> </b>
:<code class="special">[range]</code>rubyd[o] <code class="special">{cmd}</code>  在 <code class="special">[range]</code> 界定的每行上分别执行 Ruby 命令 <code class="special">{cmd}</code>，执行
                        时，$_ 设为相应的行文本，不含结尾的 <code class="special">&lt;EOL&gt;</code>。修改 $_ 就
                        会修改相应的行，不过要 <code class="note">注意</code>: 此命令不能用来增加或者删
                        除行。
                        缺省的 <code class="special">[range]</code> 是整个文件: "1,$"。

                                                        <b class="vimtag"> <a name=":rubyfile">:rubyfile</a> </b> <b class="vimtag"> <a name=":rubyf">:rubyf</a> </b>
:rubyf[ile] <code class="special">{file}</code>      执行 Ruby 脚本文件 <code class="special">{file}</code>。这和 `:ruby load <code class="badlink">'file'</code>` 相
                        当，但可用文件名自动补全功能。


 <a href="eval.html#sandbox">sandbox</a>  里不能执行 Ruby 命令。

</section><hr class="doubleline" /><section class=inner>
<h4>2. Vim 模块                                             <b class="vimtag"> <a name="ruby-vim">ruby-vim</a> </b></h4>
Ruby 代码通过 "Vim" 模块调用所有的 vim 功能。

概述: 
<code class="example">        print "Hello"                           # 显示消息</code>
<code class="example">        Vim.command(cmd)                        # 执行 ex 命令</code>
<code class="example">        num = Vim::Window.count                 # 得到窗口行数</code>
<code class="example">        w = Vim::Window[n]                      # 得到第 "n" 个窗口</code>
<code class="example">        cw = Vim::Window.current                # 得到当前窗口</code>
<code class="example">        num = Vim::Buffer.count                 # 得到缓冲区的个数</code>
<code class="example">        b = Vim::Buffer[n]                      # 得到第 "n" 个缓冲区</code>
<code class="example">        cb = Vim::Buffer.current                # 得到当前缓冲区</code>
<code class="example">        w.height = lines                        # 设置窗口高度</code>
<code class="example">        w.cursor = [row, col]                   # 设置窗口里的光标位置</code>
<code class="example">        pos = w.cursor                          # 得到数组 [行, 列]</code>
<code class="example">        name = b.name                           # 得到缓冲区的文件名</code>
<code class="example">        line = b[n]                             # 得到缓冲区的某一行</code>
<code class="example">        num = b.count                           # 得到总的行数</code>
<code class="example">        b[n] = str                              # 设置缓冲区的某一行</code>
<code class="example">        b.delete(n)                             # 删除某一行</code>
<code class="example">        b.append(n, str)                        # 在第 n 行后增加一行</code>
<code class="example">        line = Vim::Buffer.current.line         # 得到当前行</code>
<code class="example">        num = Vim::Buffer.current.line_number   # 得到当前行号</code>
<code class="example">        Vim::Buffer.current.line = "test"       # 设置当前行</code>


模块函数:

                                                        <b class="vimtag"> <a name="ruby-message">ruby-message</a> </b>
Vim::message(<code class="special">{msg}</code>)
        显示消息 <code class="special">{msg}</code>。

                                                        <b class="vimtag"> <a name="ruby-blob">ruby-blob</a> </b>
Vim::blob(<code class="special">{arg}</code>)
        返回来自 <code class="special">{arg}</code> 的  <a href="eval.html#Blob">Blob</a>  字面常量字符串。

                                                        <b class="vimtag"> <a name="ruby-set_option">ruby-set_option</a> </b>
Vim::set_option(<code class="special">{arg}</code>)
        设置 vim 选项。<code class="special">{arg}</code> 可以是任何一个 ":set" 命令接受的命令。 <code class="note">注意</code> 这意
        味着参数里不能有空格！参见  <a href="options.html#:set">:set</a> 。

                                                        <b class="vimtag"> <a name="ruby-command">ruby-command</a> </b>
Vim::command(<code class="special">{cmd}</code>)
        执行 Ex 命令 <code class="special">{cmd}</code>。

                                                        <b class="vimtag"> <a name="ruby-evaluate">ruby-evaluate</a> </b>
Vim::evaluate(<code class="special">{expr}</code>)
        用 vim 内部的表达式分析器执行 <code class="special">{expr}</code> (参看  <a href="eval.html#expression">expression</a> )。执行结果返回
        的类型如下:
        - Integer， 如果 Vim 表达式返回数值
        - Float，如果 Vim 表达式返回浮点数
        - String，如果 Vim 表达式返回字符串
        - Array，如果 Vim 表达式返回 Vim 列表
        - Hash，如果 Vim 表达式返回 Vim 字典
        递归扩展字典和列表。

</section><hr class="doubleline" /><section class=inner>
<h4>3. Vim::Buffer 对象                                     <b class="vimtag"> <a name="ruby-buffer">ruby-buffer</a> </b></h4>
Vim::Buffer 对象代表 Vim 缓冲区。

类方法:

current         返回当前缓冲区对象。
count           返回缓冲区的总数。
self[<code class="special">{n}</code>]       返回第 <code class="special">{n}</code> 个缓冲区。首个缓冲区的序号是 0。

方法:

name            返回缓冲区的全名。
number          返回缓冲区的序号。
count           返回总行数。
length          返回总行数。
self[<code class="special">{n}</code>]       从缓冲区中返回一行。<code class="special">{n}</code> 是行号。
self[<code class="special">{n}</code>] = <code class="special">{str}</code>
                设置缓冲区的一行。<code class="special">{n}</code> 是行号。
delete(<code class="special">{n}</code>)     删除缓冲区的一行。<code class="special">{n}</code> 是行号。
append(<code class="special">{n}</code>, <code class="special">{str}</code>)
                在第 <code class="special">{n}</code> 行后增加一行。
line            如果缓冲区激活，返回缓冲区的当前行。
line = <code class="special">{str}</code>    如果缓冲区激活，设置缓冲区的当前行。
line_number     如果缓冲区激活，返回当前行的行号。

</section><hr class="doubleline" /><section class=inner>
<h4>4. Vim::Window 对象                                     <b class="vimtag"> <a name="ruby-window">ruby-window</a> </b></h4>
Vim::Window 对象代表 Vim 窗口。

类方法:

current         返回当前窗口对象。
count           返回窗口的总数。
self[<code class="special">{n}</code>]       返回第 <code class="special">{n}</code> 个窗口。首个窗口的序号是 0。

方法:

buffer          返回显示的缓冲区对象。
height          返回窗口的高度。
height = <code class="special">{n}</code>    设置窗口的高度为 <code class="special">{n}</code>。
width           返回窗口的宽度。
width = <code class="special">{n}</code>     设置窗口的宽度为 <code class="special">{n}</code>。
cursor          返回光标位置数组: [行、列]。
                首行号为 1 而首列号为 0。
cursor = [<code class="special">{row}</code>, <code class="special">{col}</code>]
                设置光标位置为行 <code class="special">{row}</code> 和列 <code class="special">{col}</code>。

</section><hr class="doubleline" /><section class=inner>
<h4>5. 全局变量                                             <b class="vimtag"> <a name="ruby-globals">ruby-globals</a> </b></h4>
有两个全局变量。

$curwin         当前窗口对象。
$curbuf         当前缓冲区对象。

</section><hr class="doubleline" /><section class=inner>
<h4>6. rubyeval() Vim 函数                                  <b class="vimtag"> <a name="ruby-rubyeval">ruby-rubyeval</a> </b></h4>
为提供双向接口的方便，可用  <a href="builtin.html#rubyeval()">rubyeval()</a>  函数来计算 Ruby 表达式并传递其值给 Vim
脚本。

Ruby 值 "true"、"false" 和 "nil" 分别转换为 v:true、v:false 和 v:null。

</section><hr class="doubleline" /><section class=inner>
<h4>7. 动态调入                                             <b class="vimtag"> <a name="ruby-dynamic">ruby-dynamic</a> </b></h4>
MS-Windows 和 Unix 上，可以动态调入 Ruby 库。 <a href="various.html#:version">:version</a>  输出这时应包括
 <a href="various.html#+ruby%2Fdyn">+ruby/dyn</a> 。

这意味着 Vim 只有在必要时才寻找 Ruby DLL 或动态库文件。如果不使用 Ruby 接口，
你就不需要它。这样，即使没有该 DLL 文件，你也可使用 Vim。


<code class="section">MS-Windows </code>

必须安装正确的 Ruby 版本才能工作。该包可以从这里下载:
<a href="http://rubyinstaller.org/downloads/">http://rubyinstaller.org/downloads/</a>
目前的版本是 rubyinstaller-2.2.5.exe

要使用 Ruby 接口，Ruby DLL 必须在搜索路径上。控制台窗口里输入 "path" 可以看到
(搜索路径) 当前使用的目录。也可用 <a href="options.html#'rubydll'">'rubydll'</a> 选项设置 Ruby DLL。

DLL 名必须匹配 Vim 编译时所使用的 Ruby 版本。目前，该名字为
"msvcrt-ruby220.dll"，也就是 Ruby 2.2.X。要确信这一点，编辑 "gvim.exe" 文件并
查找 "ruby\d*.dll\c"。

如果编译 Vim 时要使用带 MSVC 的 RubyInstaller 1.9 或 2.X，需要一点技巧。详见
src/INSTALLpc.txt。

如果 Vim 使用 RubyInstaller 2.4 或以后版本编译，可能还需要在 PATH 环境变量里加
入 "C:\Ruby<code class="special">&lt;version&gt;</code>\bin\ruby_builtin_dlls"。


<code class="section">Unix </code>

<a href="options.html#'rubydll'">'rubydll'</a> 选项可用来指定 Ruby 共享库文件，而不用编译时指定的 DYNAMIC_RUBY_DLL
文件。共享库的版本必须和 Vim 编译使用的 Ruby 版本保持一致。

</section><hr class="doubleline" /><section class=inner>
<h4> vim:tw=78:ts=8:noet:ft=help:norl:</h4></section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
